精通JavaScript是我早就想学习的书。由于年代有些久远,市面上到处都找不到卖的,我也不习惯看电子书。无奈,只得从淘宝20块钱买盗版书。第一章很基础,看完了第二章,讲了很多面向对象编程的知识,感觉很有深度,有很多不知道的技巧,现在整理一下第二章里的重点。
引用
JavaScript是一个基于引用的系统,类似指针概念。但是引用的指向只是具体的对象,而不是另一个引用。不像Perl语言中允许许多层引用,JavaScript里的结果是沿着引用链一直上溯到原来那个对象。
//将 obj 置为空对象
var obj = new Object();
// objRef 是 obj 的引用
var objRef = obj;
//修改原对象的一个属性
//(注意,这里仅是修改,不会产生新的对象)
obj.oneProperty = true;
//我们现在看到,这个改变在两个变量中都反映了出来
//(因为阿门引用的是同一个变量)
alert(obj.oneProperty === objRef.oneProperty);
var items = new Array("one", "two", "three");
var itemsRef = items;
//Array对象实质上是把每个元素作为属性保存
//所以push()方法添加新元素的时候,没有产生新的变量
items.push("four");
//这两个数组长度应该是一致的
//因为他们指向同一个数组对象
alert(items.length === itemsRef.length);
var items = new Array("one", "two", "three");
var itemsRef = items;
//将 items 置为一个新的对象
items = new Array("four", "five");
//这时 items 和 itemsRef 指向不同对象了
// itemsRef 还是指向原来的new Array("one", "two", "three");
alert(items != itemsRef);
这里要特别注意,看似是自修改对象,其结果却产生了一个新的非引用对象。在执行字符串连接操作时,结果总会是一个新的字符串对象,而非源字符串的修改版本!
var items = "test";
var itemsRef = items;
//做一个字符串连接操作
//注意:这会创建一个新对象,而非修改原对象
items += "ing";
//这时 items 和 itemsRef 的值不相等了。因为有新的字符串对象被创建。
alert(items != itemsRef);
对象
共有,私有,特权方法
JavaScript也可以像其他面向对象语言创建各种权限的变量和方法。其中,特权方法,指的是能够访问并处理自身私有变量的方法。现整理如下。
//创建一个Classroom函数,类似c++里类的定义
function Classroom(students, teacher){
//公共变量
this.students = students;
this.teacher = teacher;
//私有变量
var namelist = this.students.join(",") + " : " + this.teacher.join(",");
//公共方法
this.disp = function (){
alert("这是公共方法!");
}
this.callprivatefunction = function(){
private_function();//创建一个公共方法调用私有方法
}
//私有方法
function private_function(){
alert("这是私有方法!");
}
//特权方法
this.disp_list = function (){
alert("特权方法:" + namelist);//特权方法可以公共访问,处理私有变量
}
}
//实例化Classroom类
var class1 = new Classroom(["zgr", "lsm"], ["laoshi1", "laoshi2"] );
//公共变量可以直接访问
alert(class1.students);
alert(class1.teacher);
//私有变量直接访问不到,显示undefined
alert(class1.namelist);
//公共方法可以调用
class1.disp();
/*调用私有方法会报错
class1.init();
*/
//这个公共方法是私有方法调用的接口
class1.callprivatefunction();
//特权方法可以调用,并且访问到私有变量
class1.disp_list();